home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-ARM / PROC-ARM.{21 / UACCESS.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  6KB  |  204 lines

  1. /*
  2.  * linux/include/asm-arm/proc-armv/uaccess.h
  3.  */
  4.  
  5. /*
  6.  * The fs functions are implemented on the ARMV3 and V4 architectures
  7.  * using the domain register.
  8.  *
  9.  *  DOMAIN_IO     - domain 2 includes all IO only
  10.  *  DOMAIN_KERNEL - domain 1 includes all kernel memory only
  11.  *  DOMAIN_USER   - domain 0 includes all user memory only
  12.  */
  13.  
  14. #include <asm/hardware.h>
  15.  
  16. #define DOMAIN_CLIENT    1
  17. #define DOMAIN_MANAGER    3
  18.  
  19. #define DOMAIN_USER_CLIENT    ((DOMAIN_CLIENT) << 0)
  20. #define DOMAIN_USER_MANAGER    ((DOMAIN_MANAGER) << 0)
  21.  
  22. #define DOMAIN_KERNEL_CLIENT    ((DOMAIN_CLIENT) << 2)
  23. #define DOMAIN_KERNEL_MANAGER    ((DOMAIN_MANAGER) << 2)
  24.  
  25. #define DOMAIN_IO_CLIENT    ((DOMAIN_CLIENT) << 4)
  26. #define DOMAIN_IO_MANAGER    ((DOMAIN_MANAGER) << 4)
  27.  
  28. /*
  29.  * When we want to access kernel memory in the *_user functions,
  30.  * we change the domain register to KERNEL_DS, thus allowing
  31.  * unrestricted access
  32.  */
  33. #define KERNEL_DOMAIN    (DOMAIN_USER_CLIENT | DOMAIN_KERNEL_MANAGER | DOMAIN_IO_CLIENT)
  34. #define USER_DOMAIN    (DOMAIN_USER_CLIENT | DOMAIN_KERNEL_CLIENT  | DOMAIN_IO_CLIENT)
  35.  
  36. /*
  37.  * Note that this is actually 0x1,0000,0000
  38.  */
  39. #define KERNEL_DS    0x00000000
  40. #define USER_DS        PAGE_OFFSET
  41.  
  42. #define get_ds()    (KERNEL_DS)
  43. #define get_fs()    (current->addr_limit)
  44.  
  45. #define segment_eq(a,b)    ((a) == (b))
  46.  
  47. extern __inline__ void set_fs (mm_segment_t fs)
  48. {
  49.     current->addr_limit = fs;
  50.  
  51.     __asm__ __volatile__("mcr    p15, 0, %0, c3, c0" :
  52.         : "r" (fs ? USER_DOMAIN : KERNEL_DOMAIN));
  53. }
  54.  
  55. /* We use 33-bit arithmetic here... */
  56. #define __range_ok(addr,size) ({ \
  57.     unsigned long flag, sum; \
  58.     __asm__ __volatile__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
  59.         : "=&r" (flag), "=&r" (sum) \
  60.         : "r" (addr), "Ir" (size), "0" (current->addr_limit) \
  61.         : "cc"); \
  62.     flag; })
  63.  
  64. #define __addr_ok(addr) ({ \
  65.     unsigned long flag; \
  66.     __asm__ __volatile__("cmp %2, %0; movlo %0, #0" \
  67.         : "=&r" (flag) \
  68.         : "0" (current->addr_limit), "r" (addr) \
  69.         : "cc"); \
  70.     (flag == 0); })
  71.  
  72. #define access_ok(type,addr,size) (__range_ok(addr,size) == 0)
  73.  
  74. #define __put_user_asm_byte(x,addr,err)                \
  75.     __asm__ __volatile__(                    \
  76.     "1:    strbt    %1,[%2],#0\n"                \
  77.     "2:\n"                            \
  78.     "    .section .fixup,\"ax\"\n"            \
  79.     "    .align    2\n"                    \
  80.     "3:    mvn    %0, %3\n"                \
  81.     "    b    2b\n"                    \
  82.     "    .previous\n"                    \
  83.     "    .section __ex_table,\"a\"\n"            \
  84.     "    .align    3\n"                    \
  85.     "    .long    1b, 3b\n"                \
  86.     "    .previous"                    \
  87.     : "=r" (err)                        \
  88.     : "r" (x), "r" (addr), "i" (EFAULT), "0" (err))
  89.  
  90. #define __put_user_asm_half(x,addr,err)                \
  91. ({                                \
  92.     unsigned long __temp = (unsigned long)(x);        \
  93.     __asm__ __volatile__(                    \
  94.     "1:    strbt    %1,[%3],#0\n"                \
  95.     "2:    strbt    %2,[%4],#0\n"                \
  96.     "3:\n"                            \
  97.     "    .section .fixup,\"ax\"\n"            \
  98.     "    .align    2\n"                    \
  99.     "4:    mvn    %0, %5\n"                \
  100.     "    b    3b\n"                    \
  101.     "    .previous\n"                    \
  102.     "    .section __ex_table,\"a\"\n"            \
  103.     "    .align    3\n"                    \
  104.     "    .long    1b, 4b\n"                \
  105.     "    .long    2b, 4b\n"                \
  106.     "    .previous"                    \
  107.     : "=r" (err)                        \
  108.     : "r" (__temp), "r" (__temp >> 8),            \
  109.       "r" (addr), "r" ((int)(addr) + 1),            \
  110.        "i" (EFAULT), "0" (err));                \
  111. })
  112.  
  113. #define __put_user_asm_word(x,addr,err)                \
  114.     __asm__ __volatile__(                    \
  115.     "1:    strt    %1,[%2],#0\n"                \
  116.     "2:\n"                            \
  117.     "    .section .fixup,\"ax\"\n"            \
  118.     "    .align    2\n"                    \
  119.     "3:    mvn    %0, %3\n"                \
  120.     "    b    2b\n"                    \
  121.     "    .previous\n"                    \
  122.     "    .section __ex_table,\"a\"\n"            \
  123.     "    .align    3\n"                    \
  124.     "    .long    1b, 3b\n"                \
  125.     "    .previous"                    \
  126.     : "=r" (err)                        \
  127.     : "r" (x), "r" (addr), "i" (EFAULT), "0" (err))
  128.  
  129. #define __get_user_asm_byte(x,addr,err)                \
  130.     __asm__ __volatile__(                    \
  131.     "1:    ldrbt    %1,[%2],#0\n"                \
  132.     "2:\n"                            \
  133.     "    .section .fixup,\"ax\"\n"            \
  134.     "    .align    2\n"                    \
  135.     "3:    mvn    %0, %3\n"                \
  136.     "    b    2b\n"                    \
  137.     "    .previous\n"                    \
  138.     "    .section __ex_table,\"a\"\n"            \
  139.     "    .align    3\n"                    \
  140.     "    .long    1b, 3b\n"                \
  141.     "    .previous"                    \
  142.     : "=r" (err), "=r" (x)                    \
  143.     : "r" (addr), "i" (EFAULT), "0" (err))
  144.  
  145. #define __get_user_asm_half(x,addr,err)                \
  146. ({                                \
  147.     unsigned long __temp;                    \
  148.     __asm__ __volatile__(                    \
  149.     "1:    ldrbt    %1,[%3],#0\n"                \
  150.     "2:    ldrbt    %2,[%4],#0\n"                \
  151.     "    orr    %1, %1, %2, lsl #8\n"            \
  152.     "3:\n"                            \
  153.     "    .section .fixup,\"ax\"\n"            \
  154.     "    .align    2\n"                    \
  155.     "4:    mvn    %0, %5\n"                \
  156.     "    b    3b\n"                    \
  157.     "    .previous\n"                    \
  158.     "    .section __ex_table,\"a\"\n"            \
  159.     "    .align    3\n"                    \
  160.     "    .long    1b, 4b\n"                \
  161.     "    .long    2b, 4b\n"                \
  162.     "    .previous"                    \
  163.     : "=r" (err), "=r" (x), "=&r" (__temp)            \
  164.     : "r" (addr), "r" ((int)(addr) + 1),            \
  165.        "i" (EFAULT), "0" (err));                \
  166. })
  167.  
  168.  
  169. #define __get_user_asm_word(x,addr,err)                \
  170.     __asm__ __volatile__(                    \
  171.     "1:    ldrt    %1,[%2],#0\n"                \
  172.     "2:\n"                            \
  173.     "    .section .fixup,\"ax\"\n"            \
  174.     "    .align    2\n"                    \
  175.     "3:    mvn    %0, %3\n"                \
  176.     "    b    2b\n"                    \
  177.     "    .previous\n"                    \
  178.     "    .section __ex_table,\"a\"\n"            \
  179.     "    .align    3\n"                    \
  180.     "    .long    1b, 3b\n"                \
  181.     "    .previous"                    \
  182.     : "=r" (err), "=r" (x)                    \
  183.     : "r" (addr), "i" (EFAULT), "0" (err))
  184.  
  185. extern unsigned long __arch_copy_from_user(void *to, const void *from, unsigned long n);
  186. #define __do_copy_from_user(to,from,n)                \
  187.     (n) = __arch_copy_from_user(to,from,n)
  188.  
  189. extern unsigned long __arch_copy_to_user(void *to, const void *from, unsigned long n);
  190. #define __do_copy_to_user(to,from,n)                \
  191.     (n) = __arch_copy_to_user(to,from,n)
  192.  
  193. extern unsigned long __arch_clear_user(void *addr, unsigned long n);
  194. #define __do_clear_user(addr,sz)                \
  195.     (sz) = __arch_clear_user(addr,sz)
  196.  
  197. extern unsigned long __arch_strncpy_from_user(char *to, const char *from, unsigned long count);
  198. #define __do_strncpy_from_user(dst,src,count,res)        \
  199.     (res) = __arch_strncpy_from_user(dst,src,count)
  200.  
  201. extern unsigned long __arch_strlen_user(const char *s);
  202. #define __do_strlen_user(s,res)                    \
  203.     (res) = __arch_strlen_user(s)
  204.